package com.tedu.egmvcboot.exception;

import com.tedu.egmvcboot.result.JsonResult;
import com.tedu.egmvcboot.result.Status;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.validation.ConstraintViolationException;

/**
 * 全局异常处理器
 * 1.要在当前类上添加注解@ControllerAdvice
 * 2.每个方法用于处理一个特定异常（相当于catch） 并且方法上要使用注解：@ExceptionHandler
 *
 * 这样一来一旦一个Controller处理某个请求的方法在处理过程中抛出了一个异常时
 * SpringMVC就会自动调用当前类中处理这个异常的方法
 * 即：抛出的异常与当前类中的方法上指定的异常类型匹配的方法
 * */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler
    public JsonResult doHandleMethodArgumentNotValidException(MethodArgumentNotValidException e){
        String message = e.getFieldError().getDefaultMessage();
        log.warn(message,e);//当验证框架不通过时，可以记录警告
        return new JsonResult(Status.VALIDATE_ERROR,message);
    }
    @ExceptionHandler
    public JsonResult doHandleConstraintViolationException(ConstraintViolationException e){
        String message = e.getMessage();//findById.id: 微博ID必须在1-9999之间
        message = message.substring(message.indexOf(":")+1).trim();
        log.warn(message,e);
        return new JsonResult(Status.VALIDATE_ERROR,message);
    }

}
